package com.qdlc.p2p.dal.dao;

import java.util.Date;
import java.util.List;

import com.qdlc.p2p.dal.common.dao.BaseDao;
import com.qdlc.p2p.dal.common.model.jpa.PageDataList;
import com.qdlc.p2p.dal.dto.Borrow;
import com.qdlc.p2p.dal.dto.BorrowTender;
import com.qdlc.p2p.dal.dto.User;
import com.qdlc.p2p.dal.dto.UserVip;
import com.qdlc.p2p.dal.model.BorrowTenderModel;
import com.qdlc.p2p.dal.model.RankModel;
import com.qdlc.p2p.dal.model.TenderDynamicModel;

/**
 * 投标DAO接口
 * 
 * @author：Administrator
 * @version 2.0
 * @since 2014年7月14日
 */
public interface BorrowTenderDao extends BaseDao<BorrowTender> {

	/**
	 * 在投金额
	 * 
	 * @param userId
	 * @return
	 */
	double investIngAmount(long userId);

	/**
	 * 累计投资金额
	 * 
	 * @param userId
	 * @return
	 */
	double investAmount(long userId);

	/**
	 * 获得我的投资列表
	 * 
	 * @param borrowTenderModel
	 * @return
	 */
	PageDataList<BorrowTenderModel> list(BorrowTenderModel borrowTenderModel);

	/**
	 * 修改tender的待收本金和待收利息
	 * 
	 * @param capital
	 * @param interest
	 * @param id
	 */
	void updateRepayTender(double capital, double interest, long id);

	/**
	 * 查改用户是否已经投资此借款标
	 * 
	 * @param borrowId
	 * @param userId
	 * @return
	 */
	double hasTenderTotalPerBorrowByUserid(long borrowId, long userId);

	/**
	 * 根据borrowId获取tender的列表
	 * 
	 * @param borrowId
	 * @return
	 */
	PageDataList<BorrowTenderModel> list(long borrowId, int page, int size);

	/**
	 * 修改借款标
	 * 
	 * @param tender
	 * @return
	 */
	BorrowTender modifyBorrowTender(BorrowTender tender);

	/**
	 * 最新借款
	 * 
	 * @return
	 */
	List<BorrowTenderModel> getNewTenderList();

	/**
	 * 首页排行榜
	 *
	 * @param rank month:月排行 today:日排行 total:总排行
	 * @return 排行列表
	 */
	List<RankModel> getRankList(String rank);

	/**
	 * 今日理财动态
	 *
	 * @return 排行列表
	 */
	List<TenderDynamicModel> getTodayAddTenderList();

	/**
	 * @param tender
	 * @return
	 */
	BorrowTender addBorrowTender(BorrowTender tender);

	/**
	 * @param id
	 * @param start
	 * @param pernum
	 * @return
	 */
	PageDataList<BorrowTenderModel> getTenderListByBorrowid(long id, int start, int pernum);

	/**
	 * 当前用户秒标投标次数
	 * 
	 * @param userId
	 * @param beginDate
	 * @param endDate
	 * @return
	 */
	int getUserSecondTenderNum(long userId, Date beginDate, Date endDate);

	/**
	 * 当前用户秒标投标金额
	 * 
	 * @param userid
	 * @param beginDate
	 * @param endDate
	 * @return
	 */
	double getUserSecondTenderSum(long userId, Date beginDate, Date endDate);

	/**
	 * 计算用户在该标上累计投标金额
	 * 
	 * @param userid
	 * @param borrowId
	 * @return
	 */
	double getUserTenderSum(long userId, long borrowId);

	/**
	 * 根据标ID 和 投标状态查询投资总额
	 * 
	 * @param userid
	 * @param borrowId
	 * @return
	 */
	double getBorrowTenderSum(long borrowId, int status);

	/**
	 * 得到投标的次数
	 * 
	 * @param borrowId ,userId
	 * @return int
	 */
	public int getBorrowTenderTimes(long borrowId, long userId);

	/**
	 * 得到借出总额
	 */
	double sumTenderAccount(long userId);

	/**
	 * 更新状态
	 * 
	 * @param borrowId
	 * @param status
	 * @param preStatus
	 */
	void updateStatus(long borrowId, int status, int preStatus);

	/**
	 * 更新状态
	 * 
	 * @param borrowId
	 * @param status
	 */
	void updateStatus(long id, int status);

	/**
	 * 自动投标判断一个标一个人只能投一次
	 * 
	 * @param userId
	 * @param tenderType
	 * @param borrowId
	 * @param status
	 * @return
	 */
	public int getAutoTenderByUserId(long userId, byte tenderType, long borrowId, int status);

	/**
	 * 修改投标时候登记债权人时候的订单号
	 * 
	 * @param id 标ID
	 * @param tenderBilNo 登记债权人订单号
	 */
	void modifyTenderBilNo(long id, String tenderBilNo);

	/**
	 * 通过投标订单号查询投标记录
	 * 
	 * @param tenderBillNo 投标订单号
	 * @return 投标记录
	 */
	BorrowTender getTenderByBillNo(String tenderBillNo);

	/**
	 * 通过标ID查询投标集合
	 * 
	 * @param id 标ID
	 * @return 投标集合
	 */
	List<BorrowTender> getTenderByBorrowId(long id);

	/**
	 * 通过用户ID查询投标集合
	 * 
	 * @param id 标ID
	 * @return 投标集合
	 */
	List<BorrowTender> getTenderByUserId(long id);

	/**
	 * 我投资的 标列表
	 * 
	 * @param BorrowTenderModel
	 * @return
	 */
	PageDataList<Borrow> getBorrowlist(BorrowTenderModel model);

	/**
	 * 根据时间查询投资人个数
	 * 
	 * @param date
	 * @return 投资人个数
	 */
	int getTenderCountByDate(String date);

	/**
	 * 累计投资金额
	 * 
	 * @return
	 */
	double tenderAccount();

	/**
	 * 投资用户数个数
	 * 
	 * @param date
	 */
	int getInvestUserCount();

	/**
	 * 累计投资利息
	 * 
	 * @return
	 */
	double tenderAllInterest();

	/**
	 * 根据标ID得到当前投资总利息
	 * 
	 * @param id
	 * @return
	 */
	double getInterestByBorrowId(long id);

	/**
	 * 投资项目列表（标单位）
	 * 
	 * @param model
	 * @return
	 */
	PageDataList<BorrowTenderModel> getBorrowTenderlist(BorrowTenderModel model);

	/**
	 * 投资记录列表（投标单位）
	 * 
	 * @param model
	 * @return
	 */
	PageDataList<BorrowTenderModel> getTenderRecordlist(BorrowTenderModel model);

	/**
	 * 根据当前月得到分布图
	 * 
	 * @param type
	 * @param i
	 * @param date
	 * @return
	 */
	double getCountByTypeAndDate(int type, int i, String date);

	/**
	 * 累计总投资
	 * 
	 * @param date
	 * @return
	 */
	double getCumulativeTenderByDate(String date);

	/**
	 * 根据时间得到投资者身份证号码
	 * 
	 * @return
	 */
	List<String> getTenderCardIdsByDate(String date);

	/**
	 * 得到投资标当天复审通过总额
	 * 
	 * @param tender
	 * @return
	 */
	double getTotalMoneyByTender(BorrowTender tender);

	/**
	 * 根据VIP获得时间获取总投资额
	 * 
	 * @param vipTime
	 * @return
	 */
	double getTotalMoneyByUserVip(UserVip userVip);

	/**
	 * 查询投标使用的加息券(" + Global.DB_PREFIX + "additional_use_rate_log)
	 * (查询标详情页需要获取数据)
	 * 
	 * @param tenderId
	 * @return
	 */
	double getTenderUseRate(long tenderId);

	/**
	 * 投标使用红包总额(" + Global.DB_PREFIX + "additional_user_red_envelope)
	 * (查询标详情页需要获取数据)
	 * 
	 * @param tenderId
	 * @return
	 */
	double getTenderUseRed(long tenderId, String typeId);

	/**
	 * 投标使用体验金(" + Global.DB_PREFIX + "additional_experience_tender)
	 * (查询标详情页需要获取数据)
	 * 
	 * @param tenderId
	 * @return
	 */
	double getTenderUseExper(long tenderId);

	/**
	 * 根据用户id获取用户投资次数
	 * 
	 * @param user 用户
	 * @return
	 */
	int countTenderByUser(User user, int category);

	/**
	 * 根据标的id查询投标的人数
	 */
	long getTenderUserCountByBorrowid(long borrowId);

	/**
	 * 根据标id和 状态查询投标记录
	 * 
	 * @param borrowId
	 * @param status
	 * @return
	 * @param
	 */
	List<BorrowTender> find(long borrowId, int status);

	/**
	 * 体验标还款
	 * 
	 * @return
	 */
	List<BorrowTenderModel> repaymentExperience();

	/**
	 * 体验标还款更新状态
	 * 
	 * @return
	 */
	void modifyTenderStatus(long id, int status,double interest);

	/**
	 * 查询用户是否投过体验标之外的标
	 */
	Boolean checkTenderByUserId(long userId);

	/**
	 * 今日投资金额
	 *
	 * @return
	 */
	double todayTenderAccount();

	/**
	 * 根据borrowId获取tender的列表(app端使用)
	 *
	 * @param borrowId
	 * @return
	 */
	PageDataList<BorrowTenderModel> listInvestor(long borrowId, int page, int size);

	/**
	 * 根据时间获取投资总数
	 * @param date
	 */
	Double getTenderAmountByDate(String date);

	/**
	 * 根据borrowId、userId获取累计投资金额
	 *
	 * @param borrowId
	 * @param userId
	 * @return
	 */
	double tenderAccountSum(long borrowId, long userId);


	/**
	 * 根据userId获取用户第一次投标
	 *
	 * @param userId
	 * @return
	 */
	BorrowTender getUserFirstTender(long userId);

	/**
	 * 根据userId获取用户第一次投标
	 *
	 * @param userId
	 * @return
	 */
	BorrowTender getBorrowTenderAmountByBorrowId(long borrowId,long userId);
}
